"""
根据输入的基点经纬度和名称,镇区，计算东南西北四个方向的随机距离（4-20米内）的点位，并返回这些点位的名称和经纬度：
还有一个txt文件，用于奥维导入
"""

from decimal import Decimal, getcontext
import math
import os
import random
import pandas as pd

# 距离随机设定最大值及最小值
distance_min = 4
distance_max = 20


def calculate_surrounding_points(base_lat, base_lon, base_name):
    """
    计算基点周围四个大致方向的随机点位（带方向随机偏移的高精度版本）

    参数:
        base_lat: 基点的纬度（浮点数）
        base_lon: 基点的经度（浮点数）
        base_name: 基点的名称

    返回:
        包含四个方向点位信息的字典列表，经纬度精度保证至少6位小数
    """
    # 设置Decimal的精度上下文
    getcontext().prec = 20

    # 地球半径（米）
    earth_radius = Decimal("6371000")

    # 四个基本方位及其大致角度范围（正北为0度，顺时针增加）
    direction_ranges = {
        "北侧": (345, 15),  # 实际范围：-15°到+15°
        "东侧": (75, 105),  # 实际范围：75°到105°
        "南侧": (165, 195),  # 实际范围：165°到195°
        "西侧": (255, 285),  # 实际范围：255°到285°
    }

    points = []

    for direction, (min_angle, max_angle) in direction_ranges.items():
        # 在方向范围内随机角度（Decimal）
        random_angle = Decimal(str(random.uniform(min_angle, max_angle)))
        # 确保角度在0-360度范围内
        random_angle = random_angle % Decimal("360")

        # 随机距离（4-20米），保持高精度
        distance = Decimal(str(random.uniform(distance_min, distance_max)))

        # 将角度转换为弧度（先转换为浮点数计算三角函数）
        angle_rad = float(random_angle) * math.pi / 180.0
        sin_angle = math.sin(angle_rad)
        cos_angle = math.cos(angle_rad)

        # 将基点经纬度转换为弧度
        lat_rad = float(base_lat) * math.pi / 180.0
        lon_rad = float(base_lon) * math.pi / 180.0

        sin_lat = math.sin(lat_rad)
        cos_lat = math.cos(lat_rad)
        distance_ratio = float(distance) / float(earth_radius)

        # 计算新点的纬度（弧度）
        term1 = sin_lat * math.cos(distance_ratio)
        term2 = cos_lat * math.sin(distance_ratio) * cos_angle
        new_lat_rad = math.asin(term1 + term2)

        # 计算新点的经度（弧度）
        term3 = sin_angle * math.sin(distance_ratio) * cos_lat
        term4 = math.cos(distance_ratio) - sin_lat * math.sin(new_lat_rad)
        new_lon_rad = lon_rad + math.atan2(term3, term4)

        # 将弧度转换回角度（Decimal）
        new_lat = Decimal(str(new_lat_rad * 180.0 / math.pi)).quantize(
            Decimal("1.0000000000")
        )
        new_lon = Decimal(str(new_lon_rad * 180.0 / math.pi)).quantize(
            Decimal("1.0000000000")
        )

        # 转换为浮点数并确保6位小数精度
        new_lat_float = float(new_lat)
        new_lon_float = float(new_lon)

        # 创建点位信息
        point_info = {
            "name": f"{base_name}_{direction}",
            "latitude": new_lat_float,
            "longitude": new_lon_float,
            "direction": direction,
            "exact_angle": float(random_angle),  # 实际使用的精确角度
            "distance_from_base": float(distance),
        }

        points.append(point_info)

    return points


def export_points_to_txt(base_point: dict, surrounding_points: list, output_file: str):
    """
    将基点及周围点位按指定格式输出到TXT文件

    参数:
        base_point: 基点信息字典 {'place': str，'name': str, 'latitude': float, 'longitude': float}
        surrounding_points: 周围点位列表
        output_file: 输出文件路径
    """
    # 中文方向映射
    direction_map = {"north": "北侧", "east": "东侧", "south": "南侧", "west": "西侧"}

    with open(output_file, "a", encoding="utf-8") as f:
        # 先写入基点（如果需要）
        f.write(
            f"/{base_point['place']}/{base_point['name']} {base_point['name']} {base_point['longitude']:.8f} {base_point['latitude']:.8f}\n"
        )

        # 写入四个方向点位
        for point in surrounding_points:
            # 获取中文方向
            chinese_dir = direction_map.get(point["direction"], point["direction"])
            # 格式化写入
            f.write(
                f"/{base_point['place']}/{base_point['name']} {chinese_dir} {point['longitude']:.8f} {point['latitude']:.8f}\n"
            )


def process_excel_data(file_excel, out_path):

    df = pd.read_excel(file_excel, sheet_name="Sheet1")

    # 按镇区分组
    grouped = df.groupby("镇区")

    for place, group in grouped:
        fo = os.path.join(out_path, f"{place}基站.txt")
        for _, row in group.iterrows():
            # 创建基点信息字典
            base_point = {
                "place": row["镇区"],
                "name": row["通信基站名"],
                "latitude": float(row["纬度"]),
                "longitude": float(row["经度"]),
            }
            surrounding_points = calculate_surrounding_points(
                base_point["latitude"], base_point["longitude"], base_point["name"]
            )
            export_points_to_txt(base_point, surrounding_points, fo)


# 示例用法
if __name__ == "__main__":
    current_directory = os.path.dirname(os.path.realpath(__file__))

    def test():
        # 使用高精度经纬度输入（示例：北京天安门）
        base_latitude = 39.907500  # 高精度纬度
        base_longitude = 116.397230  # 高精度经度
        base_name = "天安门基站"

        # 创建基点信息字典
        base_point = {
            "place": "北京",
            "name": base_name,
            "latitude": base_latitude,
            "longitude": base_longitude,
        }

        surrounding_points = calculate_surrounding_points(
            base_latitude, base_longitude, base_name
        )

        print(f"基点: {base_name} ({base_latitude:.6f}, {base_longitude:.6f})")
        print("周围点位（带方向随机偏移）:")
        for point in surrounding_points:
            print(
                f"{point['name']}: 纬度 {point['latitude']:.8f}, 经度 {point['longitude']:.8f} "
                f"(大致方向: {point['direction']}, 实际角度: {point['exact_angle']:.2f}°, "
                f"距离: {point['distance_from_base']:.2f}米)"
            )

        export_points_to_txt(
            base_point, surrounding_points, os.path.join(current_directory, "基站.txt")
        )

    fi = current_directory + r"/24年环评监测清单.xlsx"
    process_excel_data(fi, current_directory + r"/输出")
